package operator;

public class Operator {
public static void main(String args[]) {
	/*算术运算符
	 * + - * / % 
	 * ++  --
	 * 计算机中加法减法都是按二进制来进行的
	 * 
	 * */
//	java中除法运算符中除数不能为小数，如果为小数，向下取整
	int a=10;
	int b=3;
	int c=3;
	int d=4;
	
	int f=-10;
	
	System.out.println(a/b);//值为3
//	java中加法运算符在输出语句中如果是两个数字相加则为数学运算符，
//	如果前面或中间有字符串则按从左到右顺序来运行，那么加号则为字符串连接符
	System.out.println(a+b);//值为:13
	/*
	 * a的二进制：00001010
	 * b的二进制：00000011
	 * 相         加：  00001101
	 * 结果为:13
	 * */
	System.out.println(a-b);//值为:7
	/*a=10;b=3;
	 * a-b=a+(-b);
	 * 
	 * 10的二进制：   00001010   反码： 00001010    补码: 00001010 
	 * -3的二进制：10000011   反码： 11111100    补码： 11111101
	 *  相加           ：                                                                                   1  00000111
	 *  								1溢出，所以不要了，则为正数，所以结果为7
	 * 		
	 * 
	 * 
	 * 		
	 * 
	 *  2的二进制：   00000010   反码：  00000010    补码: 00000010  
	 * -5的二进制：   10000101   反码：  11111010    补码： 11111011
	 *  相加           ：                                                                          	11111101(原)
	 *  									10000010（反）
	 *  									10000011（补） 									                                 
	 * 结果为:-3
	 * */
	
	System.out.println(1+a);//值为:11
	System.out.println("和是"+a+b);//值为:和是103
	System.out.println("和是"+(a+b));//值为：和是13
//	java自增自减运算符
	
	/*
	 * i=0;i=i++在java lang spec中提到：
	1、java运算符的优先级++符是大于=的。
	2、The result of the postfix increment expression is not a variable, but a value.后++符表达式的结果是个值而不是一个变量。
	也就是说后++符先将自己的值存储起来，然后对变量进行++;
	再进行赋值操作，也就是将先存储起来的值赋给变量i,这样的操作就导致了i值被置为0了*/
	
	System.out.println(a++);//10
	System.out.println(++a);//12
	System.out.println(--b);//2
	System.out.println(b--);//2
	System.out.println(b);	//1
	
	/*	关系运算符  
	 * >=  <=  == != == 
	 * */	
	System.out.println(a>=b);
	System.out.println(a<=c);
	System.out.println(a==d);
	System.out.println(b==c);
	
	/*赋值运算
	 * += -= /= *= %= =
	 * */
	int e;
	e=a;
	System.out.println(e);//12
	e+=a;
	System.out.println(e);
	e-=a;
	System.out.println(e);
	e*=a;
	System.out.println(e);
	e/=a;
	System.out.println(e);
	e%=a;
	System.out.println(e);
	
	
	/*位运算
	 * ~(取反运算)  $(与运算)  |（或运算）  ^（异或运算）  >>   <<
	 * 上面定义了c=3，d=5
	 * 
	 * 计算机中所有的数都是以补码的形势运行的
	 *^:相同则1，不同则0
	 *&:两个都为1则1
	 *|:一个为1就是1
	 * 
	 * */
	System.out.println(~c);
	/*二进制为:000000000 00000000 00000000 00000011
	 *取反后为：111111111 11111111 11111111 11111100（补码）
	 *       111111111 11111111 11111111 11111011（反码）
	 *       100000000 00000000 00000000 00000100（原码）
	 *转换为十进制：-4
	 **/
	System.out.println(c&d);
	/*c的二进制：00000000 00000000 00000000 00000011
	 *d的二进制：00000000 00000000 00000000 00000100
	 *与运算后 : 00000000 00000000 00000000 00000000
	 *转换为十进制：0
	 **/
	
	System.out.println(c|d);
	/*c的二进制：00000000 00000000 00000000 00000011
	 *d的二进制：00000000 00000000 00000000 00000100
	 *与运算后 : 00000000 00000000 00000000 00000111
	 *转换为十进制：7
	 **/
	System.out.println(c^d);
	/*c的二进制：00000000 00000000 00000000 00000011
	 *d的二进制：00000000 00000000 00000000 00000100
	 *与运算后 : 00000000 00000000 00000000 00000111
	 *转换为十进制：7
	 *
	 *某一个数据对另一个数据异或两次，该数本身不变（简单加密）
	 **/
	System.out.println(d>>c);
	/*右移  最高位是0，则左边补齐0，最高位是1，则左边补齐1
	 * 等价于d/2^c
	 * 
	 * d=4;c=3;
	 * d的二进制：00000000 00000000 00000000 00000100
	 *    右移：  000 00000000 00000000 00000000 00000(100)
	 *         
	 *         结果为0
	 * 
	 * */
	System.out.println(d<<c);
	/*左移  左边最高位丢弃，右边补0
	 * 等价于d*2^c
	 * 
	 * d=4;c=3;
	 * d的二进制：00000000 00000000 00000000 00000100
	 *左移:(000)00000 00000000 00000000 00000100000
	 * 
	 * 结果为32
	 * */
	 
	System.out.println(f>>>c);
	/*无符号右移  无论最高位是多少，左边都补0
	 * 等价于d/2^c,只对正数有意义
	 * 
	 * f=-10;c=3;
	 * f的二进制：10000000 00000000 00000000 00001010
	 *    右移: 00010000000 00000000 00000000 00001(010)
	 *         
	 *         结果为
	 * 
	 * */
	
	
	/*逻辑运算
	 *   $  |  ^  $$ ||
	 * 逻辑运算符$与$$的区别？同理 |与||的区别
	 * &&具有短路效果，左边false则右边不执行
	 * &左边无论是什么右边都运行
	 * ||具有短路效果，左边true则右边不执行
	 * |左边无论是什么右边都运行
	 * 所以开发中常用&&，||，！三个运算符
	 * */
	
} 
}
